package optresult

import "gf-xb-api/cwt/result"

type OperationTResultRes[T any] struct {
	ResultType int    `json:"code"    dc:"错误码：3成功，非3失败"`
	Message    string `json:"message" dc:"异常信息"`
	Data       *T     `json:"data"    dc:"结果信息"`
}

func (r *OperationTResultRes[T]) SuccessAll(data *T, msg string) {
	if msg == "" {
		msg = "操作成功"
	}

	r.ResultType = result.CodeOK.ResultType()
	r.Message = msg
	r.Data = data
}

func (r *OperationTResultRes[T]) Success(data *T) {
	r.SuccessAll(data, "")
}

func (r *OperationTResultRes[T]) SuccessNo() {
	r.Success(nil)
}
func (r *OperationTResultRes[T]) SuccessMsg(msg string) {
	r.SuccessAll(nil, msg)
}
func (r *OperationTResultRes[T]) Fail(msg string) {
	if msg == "" {
		msg = "操作失败"
	}

	r.ResultType = result.CodeInternalError.ResultType()
	r.Message = msg

	var data *T
	r.Data = data
}

func (r *OperationTResultRes[T]) FailNo() {
	r.Fail("操作失败")
}

// SuccessAll 上面是给结构体定义的函数
// 下面是给包提定义的函数
func SuccessAll[T any](data *T, msg string) *OperationTResultRes[T] {
	if msg == "" {
		msg = "操作成功"
	}
	return &OperationTResultRes[T]{result.CodeOK.ResultType(), msg, data}
}

func Success[T any](data *T) *OperationTResultRes[T] {

	return SuccessAll(data, "")
}

func SuccessNo[T any]() *OperationTResultRes[T] {
	var data *T
	return Success(data)
}

func SuccessMsg[T any](msg string) *OperationTResultRes[T] {
	return SuccessAll[T](nil, msg)
}

func Fail[T any](msg string) *OperationTResultRes[T] {
	if msg == "" {
		msg = "操作失败"
	}

	var data *T
	return &OperationTResultRes[T]{result.CodeInternalError.ResultType(), msg, data}
}

func FailNo[T any]() *OperationTResultRes[T] {
	return Fail[T]("操作失败")
}
